package heap

// 代表符号引用
type SymRef struct {
	cp        *ConstantPool
	className string
	// 此符号引用的目标类
	class     *Class
}

// 通过Class的符号引用解析成Class对象的直接引用
func (self *SymRef) ResolveClass() *Class {
	if self.class == nil {
		self.resolveClassRef()
	}
	return self.class
}

func (self *SymRef) resolveClassRef() {
	// 获取当前常量池所属的类。也就是触发这个符号解析所属的类
	currentClass := self.cp.class
	// 比如Class1中import了Class2，那这里的变量currentClass就是Class1.尝试用相同的类加载器去加载Class2
	class := currentClass.loader.LoadClass(self.className)
	if !class.isAccessibleTo(currentClass) {
		// 没有权限访问
		panic("java.lang.IllegalAccessError")
	}
	self.class = class

}
